<#
.SYNOPSIS
基于 JSON 配置下载文件。

.DESCRIPTION
该脚本从 JSON 配置中的 URL 下载文件。

.PARAMETER ConfigPath
JSON 配置文件的路径。

.PARAMETER OutputPath
下载的文件将保存在的目录。
#>
function Download-Files {
    param (
        [string]$configPath,
        [string]$outputPath
    )
    # 读取 JSON 格式的配置文件
    $configContent = Get-Content -Path $configPath -Raw | ConvertFrom-Json
    # 导入 WebClient 类
    $client = New-Object System.Net.WebClient
    # 初始化已下载文件计数
    $downloadedCount = 0
    # 获取下载总数
    $totalDownloads = $configContent.downloads.Count
    Write-Host "共计 $totalDownloads 个文件"
    # 下载前不显示进度条
    $downloads0FileName = $configContent.downloads[0].fileName
    Write-Progress -Activity "1. $downloads0FileName 下载中..." -Status "0%"  -PercentComplete 1
    # 使用读取到的配置信息进行下载
    $configContent.downloads | ForEach-Object {
        $url = $_.url
        $fileName = $_.fileName

        $destinationPath = Join-Path $outputPath $fileName
        # 计算进度百分比并显示进度条（只在下载开始后才显示）
        if ($downloadedCount -gt 0) {
            $percent = [int]($downloadedCount / $totalDownloads * 100)
            Write-Progress -Activity "$($downloadedCount+1). $fileName 下载中..." -Status "$percent%" -PercentComplete $percent        
        }
        $client.DownloadFile($url, $destinationPath)
        Write-Host "$($downloadedCount + 1). $fileName 下载完成"
        # 增加已下载文件计数
        $downloadedCount++
    }

    # 清理 WebClient 对象
    $client.Dispose()
}

# 记录脚本开始时间
$startTime = Get-Date

# 调用函数进行下载
$configPath = Join-Path $PSScriptRoot "download-software-list.json"
Download-Files -configPath $configPath -outputPath $PSScriptRoot

# 计算耗时时间并格式化为时分秒
$endTime = Get-Date
$elapsedTime = $endTime - $startTime
$hours = $elapsedTime.Hours
$minutes = $elapsedTime.Minutes
$seconds = $elapsedTime.Seconds
$formattedElapsedTime = "{0:D2}:{1:D2}:{2:D2}" -f $hours, $minutes, $seconds
Write-Host "操作耗时: $formattedElapsedTime"

Write-Host ""
Read-Host -Prompt "按回车键退出"
